package com.yeyks.commonReference.service.consumer;

import com.baomidou.mybatisplus.extension.service.IService;
import com.yeyks.account.dal.domain.AccountInfo;
import com.yeyks.common.ajax.AjaxResponseBody;
import com.yeyks.common.appcommon.dto.platform.AppMemberCardDTO;
import com.yeyks.common.appcommon.param.platform.QueryMinMemberCardParam;
import com.yeyks.common.appcommon.result.CommonPage;
import com.yeyks.common.appcommon.result.CommonResult;
import com.yeyks.common.base.PageResult;
import com.yeyks.common.dto.AccountCardDTO;
import com.yeyks.common.param.member.*;
import com.yeyks.common.result.member.MemberCardHelpPayListResult;
import com.yeyks.consumer.dal.domain.MemberCard;
import com.yeyks.consumer.param.MemberCardCheckParam;
import com.yeyks.consumer.param.MemberCardTypeParam;
import com.yeyks.order.dal.domain.OrderHead;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;


/**
 * <p>
 * 会员卡表 服务类
 * </p>
 *
 * @author yun
 * @since 2019-06-25
 */
public interface MemberCardService extends IService<MemberCard> {
    //检查卡是否已出售
    Boolean checkCardEnable(MemberCardCheckParam param);

    AjaxResponseBody selectForHotelManagerPage(MemberCardQueryParam memberCardQueryParam);

    //查询
    AjaxResponseBody selectAll(MemberCardQueryParam memberCardQueryParam);

    AjaxResponseBody bindVipCard(Integer hotelId, String startCardId, String endCardId);

    AjaxResponseBody unBindVipCard(String startCardId, String endCardId);

    /**
     * vip卡退款新版
     *
     * @param orderHead
     * @param refundAmount
     */
    @Transactional(rollbackFor = Exception.class)
    void refundAmountV2(OrderHead orderHead, Integer refundAmount);

    /**
     * 生成对应数量的会员卡
     *
     * @param count
     */
    void createMemberCard(Integer count, Integer cardType, Integer givenAmount, Integer saleType, Integer salePrice);

    /**
     * 通过会员卡id获取会员卡信息
     *
     * @param id
     * @return
     */
    MemberCard selectById(Integer id);

    /**
     * 通过会员卡号获取会员卡
     *
     * @param cardNo
     * @return
     */
    MemberCard selectByCardNo(String cardNo);

    /**
     * 会员权益
     *
     * @return
     */
    Object advantage(MemberCardTypeParam param);

    /**
     * 获取钱包说明
     *
     * @return
     */
    Object walletDesc(MemberCardTypeParam param);

    /**
     * 修改会员卡信息
     *
     * @return
     */
    Integer update(MemberCard memberCard);

    /**
     * 查询运营商，销售商的所有vip卡片
     *
     * @param memberCardQueryParam 查询参数
     * @param loginUser            当前登录用户
     * @return 返回分页信息
     */
    AjaxResponseBody selectServerAll(MemberCardServerQueryParam memberCardQueryParam, AccountInfo loginUser);

    /**
     * 运营商、服务商【尊享】批量绑卡
     *
     * @param memberCardBindParam 更新参数
     * @return 返回操作信息
     */
    AjaxResponseBody bindServerVipCard(MemberCardBindParam memberCardBindParam);


    /**
     * 分页查询【优享】VIP卡
     *
     * @param param     查询参数
     * @param loginUser 操作人
     * @return 返回结果
     */
    AjaxResponseBody selectMinVipCard(MinMemberCardQueryParam param, AccountInfo loginUser);

    /**
     * 批量绑定【优享】VIP卡
     *
     * @param param 绑定输入参数
     * @return 响应结果
     */
    AjaxResponseBody bindMinVipCard(MinMemberCardBindParam param);

    /**
     * 查询运营商，销售商的所有vip卡片
     *
     * @param memberCardQueryParam 查询参数
     * @return 返回操作信息
     */
    AjaxResponseBody selectForHotelServerManagerPage(MemberCardServerQueryParam memberCardQueryParam, AccountInfo loginUser);

    /**
     * 查询该用户的会员卡对应的酒店账户id和会员卡号
     *
     * @param userId
     * @param cardType 1甄选，2精选
     * @return
     */
    AccountCardDTO selectOperatorIdAndCardNoByUserId(Integer userId, Integer cardType);

    /**
     * 通过会员卡和类型查询会员卡对象
     *
     * @param cardNo    会员卡号
     * @param salerType 0:运营商 1：服务商 2：卡商
     * @param cardType  1：大V 2：小V
     * @return
     */
    MemberCard selectByCardNoAndType(String cardNo, Integer salerType, Integer cardType);

    /**
     * 查询 酒店 的所有 【精选】 卡片
     *
     * @param memberCardQueryParam 查询参数
     * @param loginUser            登录用户
     * @return 返回结果
     */
    AjaxResponseBody selectChoiceAll(MemberCardChoiceQueryParam memberCardQueryParam, AccountInfo loginUser);

    /**
     * 批量绑定
     *
     * @param hotelId
     * @param startCardId
     * @param endCardId
     * @return
     */
    AjaxResponseBody bindChoiceCard(Integer hotelId, String startCardId, String endCardId);


    //==============================admin - app ========================

    /**
     * 分页查询【优享】VIP卡 admin - app
     *
     * @param param   查询参数
     * @param convert 操作人
     * @return 返回结果
     */
    CommonResult<CommonPage<AppMemberCardDTO>> pageMinVipList(QueryMinMemberCardParam param, AccountInfo convert);

    /**
     * 通过卡商id和卡商类型获取该卡商对应的酒店id集合
     *
     * @param salerId   卡商id
     * @param salerType 卡商类型(可不传)0:运营商 1：服务商 2：卡商
     * @param cardType  卡类型1:甄选  2：精选
     * @return
     */
    List<MemberCard> selectBySalerIdAndSalerType(Integer salerId, Integer salerType, Integer cardType);

    /**
     * web端充值
     *
     * @param param
     * @return
     */
    Boolean webRecharge(MemberCardRechargeParam param);

    /**
     * 查询卡信息，key 为cardNo， value为对象信息
     * @param cardNoList
     * @return
     */
    Map<String, MemberCard> getMapList(List<String> cardNoList);

    /**
     * 运营商 给 卡商 划拨卡号
     * @param param 输入参数
     * @return 返回结果
     */
    AjaxResponseBody bindMinVipCardBusiness(MinMemberCardBusinessBindParam param, AccountInfo loginUser);

    /**
     * 会员卡代卖列表
     *
     * @param param
     * @return
     */
    PageResult<MemberCardHelpPayListResult> helpPayList(MemberCardHelpPayListParam param);

    /**
     * 会员卡代卖
     *
     * @param cardNo
     * @param loginUser
     * @return
     */
    Boolean helpPay(String cardNo, AccountInfo loginUser);

    /**
     * 运营商会员卡代卖
     *
     * @param startCardNo 起始卡号
     * @param endCardNo 结束卡号
     * @param loginUser 当前登录用户
     * @return 返回结果
     */
    Boolean helpBusinessPay(String startCardNo, String endCardNo, AccountInfo loginUser);

    /**
     * 随机获取该[运营商/卡商]下的一张激活会员卡
     *
     * @param loginUser 当前登录用户
     * @return 返回卡号信息
     */
    String getRandomCardNoByAccount(AccountInfo loginUser);
}
